package top.roadvast.activiti;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.IOUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @Author 郭泽鹏
 * @Date 2020/6/25 14:01
 * @Version 1.0
 * @Description
 *  需求：
 *      1.从activiti的 act_ge_bytearray 表中读取两个资源文件
 *      2.将两个资源文件保存到路径：D:\IDEA\spring-boot-activiti\src\main\resources\from-database 下
 *
 *  技术方案：
 *      1.第一种方式：使用activiti的api方式实现
 *      2.第二种方式：用原理层面，可以使用jdbc的对blob类型，clob类型数据的读取和保存
 *          IO流转换：使用commons-io.jar包可以轻松解决IO操作
 *
 *  真实应用场景：用户想看这个请假流程具体有哪些步骤要走
 */
public class BpmnFileQuery {
    public static void main(String[] args) {
        //1、创建ProcessEngine对象
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        //2、创建RepositoryService对象
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        //3、执行查询操作，查询出想要的流程定义
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()     //创建流程定义查询器
                                                                .processDefinitionKey("holiday")       //流程定义的key
                                                                .list();
        InputStream pngIs = null;
        InputStream bpmnIs = null;
        FileOutputStream pngOs = null;
        FileOutputStream bpmnOs = null;
        try {
            for (ProcessDefinition processDefinition : list) {
                //4、通过流程定义信息得到部署ID
                String deploymentId = processDefinition.getDeploymentId();
                //5、通过repositoryService的方法，实现读取图片信息及bpmn文件信息（输入流）
                //getResourceAsStream:第一个参数代表流程部署id，第二个参数代表资源名称
                //processDefinition.getDiagramResourceName()：代表获取png图片资源的名称
                //processDefinition.getResourceName()：代表获取bpmn文件的名称
                pngIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
                bpmnIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());

                //6、构建出outputStream流    参数：filePath
                pngOs = new FileOutputStream(System.getProperty("user.dir") + "\\src\\main\\resources\\from-database\\"
                        + processDefinition.getDiagramResourceName());
                bpmnOs = new FileOutputStream(System.getProperty("user.dir") + "\\src\\main\\resources\\from-database\\"
                        + processDefinition.getResourceName());
                //7、输入流和输出流之间的转换    commons-io包
                IOUtils.copy(pngIs, pngOs);
                IOUtils.copy(bpmnIs, bpmnOs);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //8、关闭流
            try {
                if (pngOs != null) pngOs.close();
                if (bpmnOs != null) bpmnOs.close();
                if (pngIs != null) pngIs.close();
                if (bpmnIs != null) bpmnIs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}